home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Compendium Deluxe 2
/
LSD and 17bit Compendium Deluxe - Volume II.iso
/
a
/
prog
/
asmsrc
/
technowar.lha
/
SourceCode
/
techno.s
Wrap
Text File
|
1990-09-13
|
51KB
|
2,819 lines
Section Demo,Code_C
Opt C-,O+,w-
down1 = 102*40
down2 = 168*40
swide = 44
headspeed = 3
time = 900*headspeed
load = 14 ; trap number to nondos load
bgc = $dff1fe
Start: move.w #$7fff,$dff096
move.w #$7fff,$dff098
move.w #$7fff,$dff09a
move.w #$7fff,$dff09c
move.w #$7fff,$dff09e
move.l #0,0
move.l $80,a0
move.l a0,volumespace
add.l #$18000,a0
move.l a0,my_mem
lea loadtracks(pc),a0
move.l a0,$80+(4*load)
lea $dff000,a5 ; hardware base address
Move.w $1c(a5),OldInt ; Save Old Interupts
Move.w $02(a5),OldDma ; Save Old DMA
Move.w #$7fff,$9a(a5) ; Clear DMA
Move.w #$7fff,$96(a5) ; Clear Interupts
Move.w #$7fff,$9c(a5) ; Clear Interupt Requests
Move.l $6c.w,OldV3 ; save level 3 int
move.l $78,old
Move.l #my_level3,$6c.w ; put new copper interupt
Move.l #my_copper,$80(a5) ; Address of copper 1
move.l #l6int,$78
Move.w #$e010,$9a(a5) ; Start interupts
Move.w #$83df,$96(a5) ; Start DMA
Move.w #1,$88(a5) ; Strobe for copper start
MOVE.L #1773447,D7 ; PAL
move.l d7,timervalue
divu #125,D7 ; Default to normal 50 Hz timer
move.w d7,ciatime
move.b #$7f,$bfdd00
move.b #%00010001,$bfde00 ; cra
move.b #%10000001,$bfdd00 ; icr
move.b ciatime+0,$bfd400
move.b ciatime+1,$bfd500
move.l #scrollmem,d0
move.w d0,splane0_lo
swap d0
move.w d0,splane0_hi
swap d0
add.l #swide,d0
move.w d0,splane1_lo
swap d0
move.w d0,splane1_hi
swap d0
add.l #swide,d0
move.w d0,splane2_lo
swap d0
move.w d0,splane2_hi
move.b #$30,pic_down
move.l #intro_pic,iff
bsr show_iff
move.l #0,d0
bsr fadein
bsr loadmodule
add.l #20,diskptr
move.l #0,d0
bsr fadeout
move.b #$1c,pic_down
st equon
bsr mt_init
st mt_enable
move.l #main_pic,iff
bsr show_iff
move.l #0,d0
bsr fadein
move.l mt_data1,d0
move.l mt_data2,d1
move.l d0,mt_data2
move.l d1,mt_data1
next_module:
bsr loadmodule
add.l #20,diskptr
.wait cmp.w #-1,songended
bne .wait
sf mt_enable
bsr mt_init
st mt_enable
move.l mt_data1,d0
move.l mt_data2,d1
move.l d0,mt_data2
move.l d1,mt_data1
move.l diskptr,a6
cmp.l #-1,(a6)
bne next_module
move.l #diskmap,diskptr
bra next_module
quit:
lea $dff000,a5 ; hardware base address
move.l #0,$80(a5) ; blank copper list
move.l #0,$84(a5) ; if gfx lib not open (slayer boot)
move.w #0,$180(a5) ; bgc to black
Move.l OldV3,$6c.w ; restore old l3
bsr mt_end
move.l old,$78
Lea GfxLib,a1 ; Pointer to Library Text
move.l 4.w,a6
jsr -132(a6) ; forbid
Move.l 4.w,a6 ; Exec
Moveq.l #0,d0 ; Clear D0
Jsr -$228(a6) ; Open Library
cmp.l #0,d0
beq no_gfx_lib ; if gfx lib not open dont restore copper lib (slayer boot)
Move.l d0,a1
Move.l $26(a1),$80(a5) ; restore copper 1
Move.l $32(a1),$84(a5) ; restore copper 2
no_gfx_lib:
Move.w OldInt,d0 ; start old interupts
Or.w #$8000,d0
Move.w d0,$9a(a5)
Move.w OldDma,d0 ; start old DMA
Or.w #$8000,d0
Move.w d0,$96(a5)
Move.b #$9b,$bfed01 ; Start Timers
Move.l 4.w,a6 ; Close Gfx lib
Jsr -$19e(a6)
move.l 4.w,a6
jsr -138(a6) ; permit
move.w #0,$bfec00 ; clear kbd
Moveq.l #0,d0 ; No errors
Rts ; Exit
****************************************************
my_level3:
Movem.l d0-d7/a0-a6,-(a7) ; New copper
Move.w #$10,$dff09c ; Serviced Interupt
tst.b equon
beq exit
move.l screen1c,d0
move.w d0,bitplane4_lo
swap d0
move.w d0,bitplane4_hi
move.l screen1b,a1
move.l a1,$dff054 ; dest mem d
Move.w #$0000,$dff044 ; blit 1st word mask source a
Move.w #$0000,$dff046 ; blit last word mask source a
move.w #%0001*256+0,$dff040 ; blit cont reg 0
move.w #0,$dff042 ; blit cont reg 1
Move.w #0,$dff066 ; modulo for dest
Move.w #256*64+20,$dff058 ; blit height,width
bsr extract_sound
*************
moveq #0,d0
cmp.w #0,showlen1
bmi len_ok1
LEA mt_chan1temp,A6
clr.l d0
MOVE.W n_period(A6),D0
beq len_ok1
move.l #35469,d1
divu d0,d1
ext.l d1
sub.w d1,showlen1
add.l d1,showsound1
len_ok1:
cmp.w #0,showlen2
bmi len_ok2
LEA mt_chan2temp,A6
clr.l d0
MOVE.W n_period(A6),D0
beq len_ok2
move.l #35469,d1
divu d0,d1
ext.l d1
sub.w d1,showlen2
add.l d1,showsound2
len_ok2:
cmp.w #0,showlen3
bmi len_ok3
LEA mt_chan3temp,A6
clr.l d0
MOVE.W n_period(A6),D0
beq len_ok3
move.l #35469,d1
divu d0,d1
ext.l d1
sub.w d1,showlen3
add.l d1,showsound3
len_ok3:
cmp.w #0,showlen4
bmi len_ok4
LEA mt_chan4temp,A6
clr.l d0
MOVE.W n_period(A6),D0
beq len_ok4
move.l #35469,d1
divu d0,d1
ext.l d1
sub.w d1,showlen4
add.l d1,showsound4
len_ok4:
*************
bsr wtblit
move.l screen1a,d0
move.l screen1b,d1
move.l screen1c,d2
move.l d1,screen1a
move.l d2,screen1b
move.l d0,screen1c
bsr scroll_text
move.w #$444,bgc
Exit: Movem.l (a7)+,d0-d7/a0-a6
Rte ; Return from Interupt
********************************************************
scroll_text:
sub.w #$22,scroll_off+2
move.w scroll_off+2,d0
cmp.w scroll_trigger,d0
bgt scroll_ok
move.w #$ff,scroll_off+2
lea scrollmem,a3
move.l a3,a2
add.l #2,a2
move.w #(%1001*256)+$f0,d0
cmp.w #$00,scroll_trigger
beq .not_sub
or.w #(8192*4),d0
.not_sub
Move.l a3,$dff054 ; dest mem d
Move.l a2,$dff050 ; source mem a
Move.w #$ffff,$dff044 ; blit 1st word mask source a
move.w #$ffff,$dff046 ; blit last word mask source a
move.w #0,$dff064 ; blit modulo for source a
move.w d0,$dff040
move.w #0,$dff042 ; blit cont reg 1
Move.w #0,$dff066 ; modulo for dest
Move.w #(64*64)+(swide/2),$dff058 ; blit height,width
bsr do_blit
move.w #$00,scroll_trigger
move.l scroll_ptr,a0
.badchr add.l #1,scroll_ptr
clr.l d0
move.b (a0)+,d0
cmp.b #10,d0
beq .badchr
cmp.b #0,d0
bne.s scroller_ended
move.l #scrolltext,scroll_ptr
move.b #32,d0
scroller_ended:
cmp.b #"I",d0
beq .small_chr
cmp.b #"1",d0
beq .small_chr
cmp.b #"!",d0
beq .small_chr
cmp.b #"'",d0
beq .small_chr
cmp.b #",",d0
beq .small_chr
cmp.b #".",d0
bne .not_small_chr
.small_chr
move.w #$88,scroll_trigger
.not_small_chr
lea scrollmem,a3
add.l #swide-2,a3
sub.b #32,d0
mulu #2,d0
add.l #sfont,d0
move.l d0,a2
Move.l a3,$dff054 ; dest mem d
Move.l a2,$dff050 ; source mem a
Move.w #$ffff,$dff044 ; blit 1st word mask source a
move.w #$ffff,$dff046 ; blit last word mask source a
move.w #118-2,$dff064 ; blit modulo for source a
move.w #(%1001*256)+$f0,$dff040 ;
move.w #0,$dff042 ; blit cont reg 1
Move.w #swide-2,$dff066 ; modulo for dest
Move.w #(64*64)+1,$dff058 ; blit height,width
bsr do_blit
scroll_ok:
rts
do_blit:
Btst.b #6,$dff002
Bne.s do_blit
rts
********************************************************
extract_sound:
move.l screen1a,a1
add.l #down1,a1
move.l showsound1,a0
move.l #0,a3
move.w showlen1,a3
bsr waveform
move.l screen1a,a1
add.l #down1+20,a1
move.l showsound2,a0
move.w showlen2,a3
bsr waveform
move.l screen1a,a1
add.l #down2,a1
move.l showsound3,a0
move.w showlen3,a3
bsr waveform
move.l screen1a,a1
add.l #down2+20,a1
move.l showsound4,a0
move.w showlen4,a3
bsr waveform
rts
waveform:
cmp.w #160,a3
bpl sound_loop_ok
lea null_sample,a0
sound_loop_ok:
move.w #159,d0
lea table,a6
sound_loop:
move.w d0,d1
and.w #7,d1
moveq #0,d2
move.b (a0),d2
and.w #254,d2
move.w (a6,d2.w),d2 ; get y pos
bset.b d1,(a1,d2.w) ; set bit
cmp.b #0,d1
bne.s no_add_a1
add.l #1,a1
no_add_a1
add.l #1,a0
dbf d0,sound_loop
rts
wtblit: Btst.b #6,$dff002
Bne.s wtblit
rts
********************************************************
*********
l6int: move.w #$2000,$dff09c
tst.b $bfdd00
move.w ciatime,ciatime2
not.w ciatime2
move.b ciatime2+1,$bfe400
move.b ciatime2+0,$bfe500
bsr mt_music
rte
RealTempo dc.w 125
TimerValue dc.l 0
ciatime: dc.l 0
old: dc.l 0
n_note EQU 0 ; W
n_cmd EQU 2 ; W
n_cmdlo EQU 3 ; B
n_start EQU 4 ; L
n_length EQU 8 ; W
n_loopstart EQU 10 ; L
n_replen EQU 14 ; W
n_period EQU 16 ; W
n_finetune EQU 18 ; B
n_volume EQU 19 ; B
n_dmabit EQU 20 ; W
n_toneportdirec EQU 22 ; B
n_toneportspeed EQU 23 ; B
n_wantedperiod EQU 24 ; W
n_vibratocmd EQU 26 ; B
n_vibratopos EQU 27 ; B
n_tremolocmd EQU 28 ; B
n_tremolopos EQU 29 ; B
n_wavecontrol EQU 30 ; B
n_glissfunk EQU 31 ; B
n_sampleoffset EQU 32 ; B
n_pattpos EQU 33 ; B
n_loopcount EQU 34 ; B
n_funkoffset EQU 35 ; B
n_wavestart EQU 36 ; L
n_reallength EQU 40 ; W
mt_init MOVE.L #1773447,D7 ; PAL
move.l d7,timervalue
divu #125,D7 ; Default to normal 50 Hz timer
move.w d7,ciatime
move.w #0,songended
move.l mt_data1,A0
MOVE.L A0,mt_SongDataPtr
MOVE.L A0,A1
LEA 952(A1),A1
MOVEQ #127,D0
MOVEQ #0,D1
mtloop MOVE.L D1,D2
SUBQ.W #1,D0
mtloop2 MOVE.B (A1)+,D1
CMP.B D2,D1
BGT.S mtloop
DBRA D0,mtloop2
ADDQ.B #1,D2
LEA mt_SampleStarts(PC),A1
ASL.L #8,D2
ASL.L #2,D2
ADD.L #1084,D2
ADD.L A0,D2
MOVE.L D2,A2
MOVEQ #30,D0
mtloop3 CLR.L (A2)
MOVE.L A2,(A1)+
MOVEQ #0,D1
MOVE.W 42(A0),D1
ASL.L #1,D1
ADD.L D1,A2
ADD.L #30,A0
DBRA D0,mtloop3
OR.B #2,$BFE001
MOVE.B #6,mt_speed
CLR.B mt_counter
CLR.B mt_SongPos
CLR.W mt_PatternPos
mt_end SF mt_Enable
LEA $DFF000,A0
CLR.W $A8(A0)
CLR.W $B8(A0)
CLR.W $C8(A0)
CLR.W $D8(A0)
MOVE.W #$F,$DFF096
RTS
mt_music
MOVEM.L D0-D4/A0-A6,-(SP)
TST.B mt_Enable
BEQ mt_exit
ADDQ.B #1,mt_counter
MOVE.B mt_counter(PC),D0
CMP.B mt_speed(PC),D0
BLO.S mt_NoNewNote
CLR.B mt_counter
TST.B mt_PattDelTime2
BEQ.S mt_GetNewNote
BSR.S mt_NoNewAllChannels
BRA mt_dskip
mt_NoNewNote
BSR.S mt_NoNewAllChannels
BRA mt_NoNewPosYet
mt_NoNewAllChannels
LEA $DFF0A0,A5
LEA mt_chan1temp(PC),A6
BSR mt_CheckEfx
LEA $DFF0B0,A5
LEA mt_chan2temp(PC),A6
BSR mt_CheckEfx
LEA $DFF0C0,A5
LEA mt_chan3temp(PC),A6
BSR mt_CheckEfx
LEA $DFF0D0,A5
LEA mt_chan4temp(PC),A6
BRA mt_CheckEfx
mt_GetNewNote
MOVE.L mt_SongDataPtr(PC),A0
LEA 12(A0),A3
LEA 952(A0),A2 ;pattpo
LEA 1084(A0),A0 ;patterndata
MOVEQ #0,D0
MOVEQ #0,D1
MOVE.B mt_SongPos(PC),D0
MOVE.B (A2,D0.W),D1
ASL.L #8,D1
ASL.L #2,D1
ADD.W mt_PatternPos(PC),D1
CLR.W mt_DMACONtemp
LEA $DFF0A0,A5
LEA mt_chan1temp(PC),A6
move.l #showsound1,ss
move.l #showlen1,sl
BSR mt_PlayVoice
LEA $DFF0B0,A5
LEA mt_chan2temp(PC),A6
move.l #showsound2,ss
move.l #showlen2,sl
BSR.S mt_PlayVoice
LEA $DFF0C0,A5
LEA mt_chan3temp(PC),A6
move.l #showsound3,ss
move.l #showlen3,sl
BSR.S mt_PlayVoice
LEA $DFF0D0,A5
LEA mt_chan4temp(PC),A6
move.l #showsound4,ss
move.l #showlen4,sl
BSR.S mt_PlayVoice
BRA mt_SetDMA
mt_PlayVoice
TST.L (A6)
BNE.S mt_plvskip
BSR mt_PerNop
mt_plvskip
MOVE.L (A0,D1.L),(A6)
ADDQ.L #4,D1
MOVEQ #0,D2
MOVE.B n_cmd(A6),D2
AND.B #$F0,D2
LSR.B #4,D2
MOVE.B (A6),D0
AND.B #$F0,D0
OR.B D0,D2
TST.B D2
BEQ mt_SetRegs
MOVEQ #0,D3
LEA mt_SampleStarts(PC),A1
MOVE D2,D4
SUBQ.L #1,D2
ASL.L #2,D2
MULU #30,D4
MOVE.L (A1,D2.L),n_start(A6)
MOVE.W (A3,D4.L),n_length(A6)
MOVE.W (A3,D4.L),n_reallength(A6)
MOVE.B 2(A3,D4.L),n_finetune(A6)
MOVE.B 3(A3,D4.L),n_volume(A6)
***********
movem.l a0-a6,-(a7)
cmp.b #0,n_volume(a6)
beq no_vol
move.l ss,a0 ; sample start at
move.l n_start(a6),(a0)
move.l sl,a0 ; sound length
move.w n_length(a6),(a0)
no_vol: movem.l (a7)+,a0-a6
************
MOVE.W 4(A3,D4.L),D3 ; Get repeat
TST.W D3
BEQ.S mt_NoLoop
MOVE.L n_start(A6),D2 ; Get start
ASL.W #1,D3
ADD.L D3,D2 ; Add repeat
MOVE.L D2,n_loopstart(A6)
MOVE.L D2,n_wavestart(A6)
MOVE.W 4(A3,D4.L),D0 ; Get repeat
ADD.W 6(A3,D4.L),D0 ; Add replen
MOVE.W D0,n_length(A6)
MOVE.W 6(A3,D4.L),n_replen(A6) ; Save replen
MOVEQ #0,D0
MOVE.B n_volume(A6),D0
MOVE.W D0,8(A5) ; Set volume
BRA.S mt_SetRegs
mt_NoLoop
MOVE.L n_start(A6),D2
ADD.L D3,D2
MOVE.L D2,n_loopstart(A6)
MOVE.L D2,n_wavestart(A6)
MOVE.W 6(A3,D4.L),n_replen(A6) ; Save replen
MOVEQ #0,D0
MOVE.B n_volume(A6),D0
MOVE.W D0,8(A5) ; Set volume
mt_SetRegs
MOVE.W (A6),D0
AND.W #$0FFF,D0
BEQ mt_CheckMoreEfx ; If no note
MOVE.W 2(A6),D0
AND.W #$0FF0,D0
CMP.W #$0E50,D0
BEQ.S mt_DoSetFineTune
MOVE.B 2(A6),D0
AND.B #$0F,D0
CMP.B #3,D0 ; TonePortamento
BEQ.S mt_ChkTonePorta
CMP.B #5,D0
BEQ.S mt_ChkTonePorta
CMP.B #9,D0 ; Sample Offset
BNE.S mt_SetPeriod
BSR mt_CheckMoreEfx
BRA.S mt_SetPeriod
mt_DoSetFineTune
BSR mt_SetFineTune
BRA.S mt_SetPeriod
mt_ChkTonePorta
BSR mt_SetTonePorta
BRA mt_CheckMoreEfx
mt_SetPeriod
MOVEM.L D0-D1/A0-A1,-(SP)
MOVE.W (A6),D1
AND.W #$0FFF,D1
LEA mt_PeriodTable(PC),A1
MOVEQ #0,D0
MOVEQ #36,D2
mt_ftuloop
CMP.W (A1,D0.W),D1
BHS.S mt_ftufound
ADDQ.L #2,D0
DBRA D2,mt_ftuloop
mt_ftufound
MOVEQ #0,D1
MOVE.B n_finetune(A6),D1
MULU #36*2,D1
ADD.L D1,A1
MOVE.W (A1,D0.W),n_period(A6)
MOVEM.L (SP)+,D0-D1/A0-A1
MOVE.W 2(A6),D0
AND.W #$0FF0,D0
CMP.W #$0ED0,D0 ; Notedelay
BEQ mt_CheckMoreEfx
MOVE.W n_dmabit(A6),$DFF096
BTST #2,n_wavecontrol(A6)
BNE.S mt_vibnoc
CLR.B n_vibratopos(A6)
mt_vibnoc
BTST #6,n_wavecontrol(A6)
BNE.S mt_trenoc
CLR.B n_tremolopos(A6)
mt_trenoc
MOVE.L n_start(A6),(A5) ; Set start
MOVE.W n_length(A6),4(A5) ; Set length
MOVE.W n_period(A6),D0
MOVE.W D0,6(A5) ; Set period
MOVE.W n_dmabit(A6),D0
OR.W D0,mt_DMACONtemp
BRA mt_CheckMoreEfx
mt_SetDMA
MOVE.W #300,D0
mt_WaitDMA
DBRA D0,mt_WaitDMA
MOVE.W mt_DMACONtemp(PC),D0
OR.W #$8000,D0
MOVE.W D0,$DFF096
MOVE.W #300,D0
mt_WaitDMA2
DBRA D0,mt_WaitDMA2
************
LEA mt_chan1temp(PC),A6
move.w n_period(a6),a5
cmp.w showlen1,a5
ble no_sound1
cmp.w #160,n_replen(a6)
ble no_sound1
cmp.b #0,n_volume(a6)
beq no_sound1
move.l n_loopstart(a6),showsound1
move.w n_replen(a6),showlen1
no_sound1:
LEA mt_chan2temp(PC),A6
move.w n_period(a6),a5
cmp.w showlen2,a5
ble no_sound2
cmp.w #160,n_replen(a6)
ble no_sound2
cmp.b #0,n_volume(a6)
beq no_sound2
move.l n_loopstart(a6),showsound2
move.w n_replen(a6),showlen2
no_sound2:
LEA mt_chan3temp(PC),A6
move.w n_period(a6),a5
cmp.w showlen3,a5
ble no_sound3
cmp.w #160,n_replen(a6)
ble no_sound3
cmp.b #0,n_volume(a6)
beq no_sound3
move.l n_loopstart(a6),showsound3
move.w n_replen(a6),showlen3
no_sound3:
LEA mt_chan4temp(PC),A6
move.w n_period(a6),a5
cmp.w showlen4,a5
ble no_sound4
cmp.w #160,n_replen(a6)
ble no_sound4
cmp.b #0,n_volume(a6)
beq no_sound4
move.l n_loopstart(a6),showsound4
move.w n_replen(a6),showlen4
no_sound4:
************
LEA $DFF000,A5
LEA mt_chan4temp(PC),A6
MOVE.L n_loopstart(A6),$D0(A5)
MOVE.W n_replen(A6),$D4(A5)
LEA mt_chan3temp(PC),A6
MOVE.L n_loopstart(A6),$C0(A5)
MOVE.W n_replen(A6),$C4(A5)
LEA mt_chan2temp(PC),A6
MOVE.L n_loopstart(A6),$B0(A5)
MOVE.W n_replen(A6),$B4(A5)
LEA mt_chan1temp(PC),A6
MOVE.L n_loopstart(A6),$A0(A5)
MOVE.W n_replen(A6),$A4(A5)
mt_dskip
ADD.W #16,mt_PatternPos
MOVE.B mt_PattDelTime,D0
BEQ.S mt_dskc
MOVE.B D0,mt_PattDelTime2
CLR.B mt_PattDelTime
mt_dskc TST.B mt_PattDelTime2
BEQ.S mt_dska
SUBQ.B #1,mt_PattDelTime2
BEQ.S mt_dska
SUB.W #16,mt_PatternPos
mt_dska TST.B mt_PBreakFlag
BEQ.S mt_nnpysk
SF mt_PBreakFlag
MOVEQ #0,D0
MOVE.B mt_PBreakPos(PC),D0
CLR.B mt_PBreakPos
LSL.W #4,D0
MOVE.W D0,mt_PatternPos
mt_nnpysk
CMP.W #1024,mt_PatternPos
BLO.S mt_NoNewPosYet
mt_NextPosition
MOVEQ #0,D0
MOVE.B mt_PBreakPos(PC),D0
LSL.W #4,D0
MOVE.W D0,mt_PatternPos
CLR.B mt_PBreakPos
CLR.B mt_PosJumpFlag
ADDQ.B #1,mt_SongPos
AND.B #$7F,mt_SongPos
MOVE.B mt_SongPos(PC),D1
MOVE.L mt_SongDataPtr(PC),A0
CMP.B 950(A0),D1
BLO.S mt_NoNewPosYet
CLR.B mt_SongPos
move.w #-1,songended
mt_NoNewPosYet
TST.B mt_PosJumpFlag
BNE.S mt_NextPosition
mt_exit MOVEM.L (SP)+,D0-D4/A0-A6
RTS
mt_CheckEfx
movem.l d0-d7/a0-a6,-(a7)
********* my equ routines *********
LEA mt_chan1temp(PC),A6
cmp.w #0,n_cmd(A6)
beq no_restart_1a
cmp.w #0,showlen1
bgt.s no_restart_1a
cmp.w #100,n_length(a6)
blt.s no_restart_1a
move.l n_loopstart(a6),showsound1
move.w n_replen(a6),showlen1
no_restart_1a:
LEA mt_chan2temp(PC),A6
cmp.w #0,n_cmd(A6)
beq no_restart_2a
cmp.w #0,showlen2
bgt.s no_restart_2a
cmp.w #100,n_length(a6)
blt.s no_restart_2a
move.l n_loopstart(a6),showsound2
move.w n_replen(a6),showlen2
no_restart_2a:
LEA mt_chan3temp(PC),A6
cmp.w #0,n_cmd(A6)
beq no_restart_3a
cmp.w #0,showlen3
bgt.s no_restart_3a
cmp.w #100,n_length(a6)
blt.s no_restart_3a
move.l n_loopstart(a6),showsound3
move.w n_replen(a6),showlen3
no_restart_3a:
LEA mt_chan4temp(PC),A6
cmp.w #0,n_cmd(A6)
beq no_restart_4a
cmp.w #0,showlen4
bgt.s no_restart_4a
cmp.w #100,n_length(a6)
blt.s no_restart_4a
move.l n_loopstart(a6),showsound4
move.w n_replen(a6),showlen4
no_restart_4a:
************************************
movem.l (a7)+,d0-d7/a0-a6
BSR mt_UpdateFunk
MOVE.W n_cmd(A6),D0
AND.W #$0FFF,D0
BEQ.S mt_PerNop
MOVE.B n_cmd(A6),D0
AND.B #$0F,D0
BEQ.S mt_Arpeggio
CMP.B #1,D0
BEQ mt_PortaUp
CMP.B #2,D0
BEQ mt_PortaDown
CMP.B #3,D0
BEQ mt_TonePortamento
CMP.B #4,D0
BEQ mt_Vibrato
CMP.B #5,D0
BEQ mt_TonePlusVolSlide
CMP.B #6,D0
BEQ mt_VibratoPlusVolSlide
CMP.B #$E,D0
BEQ mt_E_Commands
SetBack MOVE.W n_period(A6),6(A5)
CMP.B #7,D0
BEQ mt_Tremolo
CMP.B #$A,D0
BEQ mt_VolumeSlide
mt_Return
RTS
mt_PerNop
MOVE.W n_period(A6),6(A5)
RTS
mt_Arpeggio
MOVEQ #0,D0
MOVE.B mt_counter(PC),D0
DIVS #3,D0
SWAP D0
CMP.W #0,D0
BEQ.S mt_Arpeggio2
CMP.W #2,D0
BEQ.S mt_Arpeggio1
MOVEQ #0,D0
MOVE.B n_cmdlo(A6),D0
LSR.B #4,D0
BRA.S mt_Arpeggio3
mt_Arpeggio1
MOVEQ #0,D0
MOVE.B n_cmdlo(A6),D0
AND.B #15,D0
BRA.S mt_Arpeggio3
mt_Arpeggio2
MOVE.W n_period(A6),D2
BRA.S mt_Arpeggio4
mt_Arpeggio3
ASL.W #1,D0
MOVEQ #0,D1
MOVE.B n_finetune(A6),D1
MULU #36*2,D1
LEA mt_PeriodTable(PC),A0
ADD.L D1,A0
MOVEQ #0,D1
MOVE.W n_period(A6),D1
MOVEQ #36,D3
mt_arploop
MOVE.W (A0,D0.W),D2
CMP.W (A0),D1
BHS.S mt_Arpeggio4
ADDQ.L #2,A0
DBRA D3,mt_arploop
RTS
mt_Arpeggio4
MOVE.W D2,6(A5)
RTS
mt_FinePortaUp
TST.B mt_counter
BNE.S mt_Return
MOVE.B #$0F,mt_LowMask
mt_PortaUp
MOVEQ #0,D0
MOVE.B n_cmdlo(A6),D0
AND.B mt_LowMask(PC),D0
MOVE.B #$FF,mt_LowMask
SUB.W D0,n_period(A6)
MOVE.W n_period(A6),D0
AND.W #$0FFF,D0
CMP.W #113,D0
BPL.S mt_PortaUskip
AND.W #$F000,n_period(A6)
OR.W #113,n_period(A6)
mt_PortaUskip
MOVE.W n_period(A6),D0
AND.W #$0FFF,D0
MOVE.W D0,6(A5)
RTS
mt_FinePortaDown
TST.B mt_counter
BNE mt_Return
MOVE.B #$0F,mt_LowMask
mt_PortaDown
CLR.W D0
MOVE.B n_cmdlo(A6),D0
AND.B mt_LowMask(PC),D0
MOVE.B #$FF,mt_LowMask
ADD.W D0,n_period(A6)
MOVE.W n_period(A6),D0
AND.W #$0FFF,D0
CMP.W #856,D0
BMI.S mt_PortaDskip
AND.W #$F000,n_period(A6)
OR.W #856,n_period(A6)
mt_PortaDskip
MOVE.W n_period(A6),D0
AND.W #$0FFF,D0
MOVE.W D0,6(A5)
RTS
mt_SetTonePorta
MOVE.L A0,-(SP)
MOVE.W (A6),D2
AND.W #$0FFF,D2
MOVEQ #0,D0
MOVE.B n_finetune(A6),D0
MULU #37*2,D0
LEA mt_PeriodTable(PC),A0
ADD.L D0,A0
MOVEQ #0,D0
mt_StpLoop
CMP.W (A0,D0.W),D2
BHS.S mt_StpFound
ADDQ.W #2,D0
CMP.W #37*2,D0
BLO.S mt_StpLoop
MOVEQ #35*2,D0
mt_StpFound
MOVE.B n_finetune(A6),D2
AND.B #8,D2
BEQ.S mt_StpGoss
TST.W D0
BEQ.S mt_StpGoss
SUBQ.W #2,D0
mt_StpGoss
MOVE.W (A0,D0.W),D2
MOVE.L (SP)+,A0
MOVE.W D2,n_wantedperiod(A6)
MOVE.W n_period(A6),D0
CLR.B n_toneportdirec(A6)
CMP.W D0,D2
BEQ.S mt_ClearTonePorta
BGE mt_Return
MOVE.B #1,n_toneportdirec(A6)
RTS
mt_ClearTonePorta
CLR.W n_wantedperiod(A6)
RTS
mt_TonePortamento
MOVE.B n_cmdlo(A6),D0
BEQ.S mt_TonePortNoChange
MOVE.B D0,n_toneportspeed(A6)
CLR.B n_cmdlo(A6)
mt_TonePortNoChange
TST.W n_wantedperiod(A6)
BEQ mt_Return
MOVEQ #0,D0
MOVE.B n_toneportspeed(A6),D0
TST.B n_toneportdirec(A6)
BNE.S mt_TonePortaUp
mt_TonePortaDown
ADD.W D0,n_period(A6)
MOVE.W n_wantedperiod(A6),D0
CMP.W n_period(A6),D0
BGT.S mt_TonePortaSetPer
MOVE.W n_wantedperiod(A6),n_period(A6)
CLR.W n_wantedperiod(A6)
BRA.S mt_TonePortaSetPer
mt_TonePortaUp
SUB.W D0,n_period(A6)
MOVE.W n_wantedperiod(A6),D0
CMP.W n_period(A6),D0
BLT.S mt_TonePortaSetPer
MOVE.W n_wantedperiod(A6),n_period(A6)
CLR.W n_wantedperiod(A6)
mt_TonePortaSetPer
MOVE.W n_period(A6),D2
MOVE.B n_glissfunk(A6),D0
AND.B #$0F,D0
BEQ.S mt_GlissSkip
MOVEQ #0,D0
MOVE.B n_finetune(A6),D0
MULU #36*2,D0
LEA mt_PeriodTable(PC),A0
ADD.L D0,A0
MOVEQ #0,D0
mt_GlissLoop
CMP.W (A0,D0.W),D2
BHS.S mt_GlissFound
ADDQ.W #2,D0
CMP.W #36*2,D0
BLO.S mt_GlissLoop
MOVEQ #35*2,D0
mt_GlissFound
MOVE.W (A0,D0.W),D2
mt_GlissSkip
MOVE.W D2,6(A5) ; Set period
RTS
mt_Vibrato
MOVE.B n_cmdlo(A6),D0
BEQ.S mt_Vibrato2
MOVE.B n_vibratocmd(A6),D2
AND.B #$0F,D0
BEQ.S mt_vibskip
AND.B #$F0,D2
OR.B D0,D2
mt_vibskip
MOVE.B n_cmdlo(A6),D0
AND.B #$F0,D0
BEQ.S mt_vibskip2
AND.B #$0F,D2
OR.B D0,D2
mt_vibskip2
MOVE.B D2,n_vibratocmd(A6)
mt_Vibrato2
MOVE.B n_vibratopos(A6),D0
LEA mt_VibratoTable(PC),A4
LSR.W #2,D0
AND.W #$001F,D0
MOVEQ #0,D2
MOVE.B n_wavecontrol(A6),D2
AND.B #$03,D2
BEQ.S mt_vib_sine
LSL.B #3,D0
CMP.B #1,D2
BEQ.S mt_vib_rampdown
MOVE.B #255,D2
BRA.S mt_vib_set
mt_vib_rampdown
TST.B n_vibratopos(A6)
BPL.S mt_vib_rampdown2
MOVE.B #255,D2
SUB.B D0,D2
BRA.S mt_vib_set
mt_vib_rampdown2
MOVE.B D0,D2
BRA.S mt_vib_set
mt_vib_sine
MOVE.B (A4,D0.W),D2
mt_vib_set
MOVE.B n_vibratocmd(A6),D0
AND.W #15,D0
MULU D0,D2
LSR.W #7,D2
MOVE.W n_period(A6),D0
TST.B n_vibratopos(A6)
BMI.S mt_VibratoNeg
ADD.W D2,D0
BRA.S mt_Vibrato3
mt_VibratoNeg
SUB.W D2,D0
mt_Vibrato3
MOVE.W D0,6(A5)
MOVE.B n_vibratocmd(A6),D0
LSR.W #2,D0
AND.W #$003C,D0
ADD.B D0,n_vibratopos(A6)
RTS
mt_TonePlusVolSlide
BSR mt_TonePortNoChange
BRA mt_VolumeSlide
mt_VibratoPlusVolSlide
BSR.S mt_Vibrato2
BRA mt_VolumeSlide
mt_Tremolo
MOVE.B n_cmdlo(A6),D0
BEQ.S mt_Tremolo2
MOVE.B n_tremolocmd(A6),D2
AND.B #$0F,D0
BEQ.S mt_treskip
AND.B #$F0,D2
OR.B D0,D2
mt_treskip
MOVE.B n_cmdlo(A6),D0
AND.B #$F0,D0
BEQ.S mt_treskip2
AND.B #$0F,D2
OR.B D0,D2
mt_treskip2
MOVE.B D2,n_tremolocmd(A6)
mt_Tremolo2
MOVE.B n_tremolopos(A6),D0
LEA mt_VibratoTable(PC),A4
LSR.W #2,D0
AND.W #$001F,D0
MOVEQ #0,D2
MOVE.B n_wavecontrol(A6),D2
LSR.B #4,D2
AND.B #$03,D2
BEQ.S mt_tre_sine
LSL.B #3,D0
CMP.B #1,D2
BEQ.S mt_tre_rampdown
MOVE.B #255,D2
BRA.S mt_tre_set
mt_tre_rampdown
TST.B n_vibratopos(A6)
BPL.S mt_tre_rampdown2
MOVE.B #255,D2
SUB.B D0,D2
BRA.S mt_tre_set
mt_tre_rampdown2
MOVE.B D0,D2
BRA.S mt_tre_set
mt_tre_sine
MOVE.B (A4,D0.W),D2
mt_tre_set
MOVE.B n_tremolocmd(A6),D0
AND.W #15,D0
MULU D0,D2
LSR.W #6,D2
MOVEQ #0,D0
MOVE.B n_volume(A6),D0
TST.B n_tremolopos(A6)
BMI.S mt_TremoloNeg
ADD.W D2,D0
BRA.S mt_Tremolo3
mt_TremoloNeg
SUB.W D2,D0
mt_Tremolo3
BPL.S mt_TremoloSkip
CLR.W D0
mt_TremoloSkip
CMP.W #$40,D0
BLS.S mt_TremoloOk
MOVE.W #$40,D0
mt_TremoloOk
MOVE.W D0,8(A5)
MOVE.B n_tremolocmd(A6),D0
LSR.W #2,D0
AND.W #$003C,D0
ADD.B D0,n_tremolopos(A6)
RTS
mt_SampleOffset
MOVEQ #0,D0
MOVE.B n_cmdlo(A6),D0
BEQ.S mt_sononew
MOVE.B D0,n_sampleoffset(A6)
mt_sononew
MOVE.B n_sampleoffset(A6),D0
LSL.W #7,D0
CMP.W n_length(A6),D0
BGE.S mt_sofskip
SUB.W D0,n_length(A6)
LSL.W #1,D0
ADD.L D0,n_start(A6)
RTS
mt_sofskip
MOVE.W #$0001,n_length(A6)
RTS
mt_VolumeSlide
MOVEQ #0,D0
MOVE.B n_cmdlo(A6),D0
LSR.B #4,D0
TST.B D0
BEQ.S mt_VolSlideDown
mt_VolSlideUp
ADD.B D0,n_volume(A6)
CMP.B #$40,n_volume(A6)
BMI.S mt_vsuskip
MOVE.B #$40,n_volume(A6)
mt_vsuskip
MOVE.B n_volume(A6),D0
MOVE.W D0,8(A5)
RTS
mt_VolSlideDown
MOVEQ #0,D0
MOVE.B n_cmdlo(A6),D0
AND.B #$0F,D0
mt_VolSlideDown2
SUB.B D0,n_volume(A6)
BPL.S mt_vsdskip
CLR.B n_volume(A6)
mt_vsdskip
MOVE.B n_volume(A6),D0
MOVE.W D0,8(A5)
RTS
mt_PositionJump
MOVE.B n_cmdlo(A6),D0
SUBQ.B #1,D0
MOVE.B D0,mt_SongPos
mt_pj2 CLR.B mt_PBreakPos
ST mt_PosJumpFlag
RTS
mt_VolumeChange
MOVEQ #0,D0
MOVE.B n_cmdlo(A6),D0
CMP.B #$40,D0
BLS.S mt_VolumeOk
MOVEQ #$40,D0
mt_VolumeOk
MOVE.B D0,n_volume(A6)
MOVE.W D0,8(A5)
RTS
mt_PatternBreak
MOVEQ #0,D0
MOVE.B n_cmdlo(A6),D0
MOVE.L D0,D2
LSR.B #4,D0
MULU #10,D0
AND.B #$0F,D2
ADD.B D2,D0
CMP.B #63,D0
BHI.S mt_pj2
MOVE.B D0,mt_PBreakPos
ST mt_PosJumpFlag
RTS
mt_SetSpeed
MOVEQ #0,D0
MOVE.B 3(A6),D0
BEQ mt_end
CMP.B #32,D0
BHS SetTempo
CLR.B mt_counter
MOVE.B D0,mt_speed
RTS
SetTempo:
CMP.W #32,D0
BHS.S setemsk
MOVEQ #32,D0
setemsk MOVE.W D0,RealTempo
MOVE.L TimerValue(PC),D2
DIVU D0,D2
move.w d2,ciatime
RTS
mt_CheckMoreEfx
BSR mt_UpdateFunk
MOVE.B 2(A6),D0
AND.B #$0F,D0
CMP.B #$9,D0
BEQ mt_SampleOffset
CMP.B #$B,D0
BEQ mt_PositionJump
CMP.B #$D,D0
BEQ mt_PatternBreak
CMP.B #$E,D0
BEQ.S mt_E_Commands
CMP.B #$F,D0
BEQ mt_SetSpeed
CMP.B #$C,D0
BEQ mt_VolumeChange
BRA mt_PerNop
mt_E_Commands
MOVE.B n_cmdlo(A6),D0
AND.B #$F0,D0
LSR.B #4,D0
BEQ.S mt_FilterOnOff
CMP.B #1,D0
BEQ mt_FinePortaUp
CMP.B #2,D0
BEQ mt_FinePortaDown
CMP.B #3,D0
BEQ.S mt_SetGlissControl
CMP.B #4,D0
BEQ mt_SetVibratoControl
CMP.B #5,D0
BEQ mt_SetFineTune
CMP.B #6,D0
BEQ mt_JumpLoop
CMP.B #7,D0
BEQ mt_SetTremoloControl
CMP.B #9,D0
BEQ mt_RetrigNote
CMP.B #$A,D0
BEQ mt_VolumeFineUp
CMP.B #$B,D0
BEQ mt_VolumeFineDown
CMP.B #$C,D0
BEQ mt_NoteCut
CMP.B #$D,D0
BEQ mt_NoteDelay
CMP.B #$E,D0
BEQ mt_PatternDelay
CMP.B #$F,D0
BEQ mt_FunkIt
RTS
mt_FilterOnOff
MOVE.B n_cmdlo(A6),D0
AND.B #1,D0
ASL.B #1,D0
AND.B #$FD,$BFE001
OR.B D0,$BFE001
RTS
mt_SetGlissControl
MOVE.B n_cmdlo(A6),D0
AND.B #$0F,D0
AND.B #$F0,n_glissfunk(A6)
OR.B D0,n_glissfunk(A6)
RTS
mt_SetVibratoControl
MOVE.B n_cmdlo(A6),D0
AND.B #$0F,D0
AND.B #$F0,n_wavecontrol(A6)
OR.B D0,n_wavecontrol(A6)
RTS
mt_SetFineTune
MOVE.B n_cmdlo(A6),D0
AND.B #$0F,D0
MOVE.B D0,n_finetune(A6)
RTS
mt_JumpLoop
TST.B mt_counter
BNE mt_Return
MOVE.B n_cmdlo(A6),D0
AND.B #$0F,D0
BEQ.S mt_SetLoop
TST.B n_loopcount(A6)
BEQ.S mt_jumpcnt
SUBQ.B #1,n_loopcount(A6)
BEQ mt_Return
mt_jmploop MOVE.B n_pattpos(A6),mt_PBreakPos
ST mt_PBreakFlag
RTS
mt_jumpcnt
MOVE.B D0,n_loopcount(A6)
BRA.S mt_jmploop
mt_SetLoop
MOVE.W mt_PatternPos(PC),D0
LSR.W #4,D0
MOVE.B D0,n_pattpos(A6)
RTS
mt_SetTremoloControl
MOVE.B n_cmdlo(A6),D0
AND.B #$0F,D0
LSL.B #4,D0
AND.B #$0F,n_wavecontrol(A6)
OR.B D0,n_wavecontrol(A6)
RTS
mt_RetrigNote
MOVE.L D1,-(SP)
MOVEQ #0,D0
MOVE.B n_cmdlo(A6),D0
AND.B #$0F,D0
BEQ.S mt_rtnend
MOVEQ #0,D1
MOVE.B mt_counter(PC),D1
BNE.S mt_rtnskp
MOVE.W (A6),D1
AND.W #$0FFF,D1
BNE.S mt_rtnend
MOVEQ #0,D1
MOVE.B mt_counter(PC),D1
mt_rtnskp
DIVU D0,D1
SWAP D1
TST.W D1
BNE.S mt_rtnend
mt_DoRetrig
MOVE.W n_dmabit(A6),$DFF096 ; Channel DMA off
MOVE.L n_start(A6),(A5) ; Set sampledata pointer
MOVE.W n_length(A6),4(A5) ; Set length
MOVE.W #300,D0
mt_rtnloop1
DBRA D0,mt_rtnloop1
MOVE.W n_dmabit(A6),D0
BSET #15,D0
MOVE.W D0,$DFF096
MOVE.W #300,D0
mt_rtnloop2
DBRA D0,mt_rtnloop2
MOVE.L n_loopstart(A6),(A5)
MOVE.L n_replen(A6),4(A5)
mt_rtnend
MOVE.L (SP)+,D1
RTS
mt_VolumeFineUp
TST.B mt_counter
BNE mt_Return
MOVEQ #0,D0
MOVE.B n_cmdlo(A6),D0
AND.B #$F,D0
BRA mt_VolSlideUp
mt_VolumeFineDown
TST.B mt_counter
BNE mt_Return
MOVEQ #0,D0
MOVE.B n_cmdlo(A6),D0
AND.B #$0F,D0
BRA mt_VolSlideDown2
mt_NoteCut
MOVEQ #0,D0
MOVE.B n_cmdlo(A6),D0
AND.B #$0F,D0
CMP.B mt_counter(PC),D0
BNE mt_Return
CLR.B n_volume(A6)
MOVE.W #0,8(A5)
RTS
mt_NoteDelay
MOVEQ #0,D0
MOVE.B n_cmdlo(A6),D0
AND.B #$0F,D0
CMP.B mt_Counter,D0
BNE mt_Return
MOVE.W (A6),D0
BEQ mt_Return
MOVE.L D1,-(SP)
BRA mt_DoRetrig
mt_PatternDelay
TST.B mt_counter
BNE mt_Return
MOVEQ #0,D0
MOVE.B n_cmdlo(A6),D0
AND.B #$0F,D0
TST.B mt_PattDelTime2
BNE mt_Return
ADDQ.B #1,D0
MOVE.B D0,mt_PattDelTime
RTS
mt_FunkIt
TST.B mt_counter
BNE mt_Return
MOVE.B n_cmdlo(A6),D0
AND.B #$0F,D0
LSL.B #4,D0
AND.B #$0F,n_glissfunk(A6)
OR.B D0,n_glissfunk(A6)
TST.B D0
BEQ mt_Return
mt_UpdateFunk
MOVEM.L A0/D1,-(SP)
MOVEQ #0,D0
MOVE.B n_glissfunk(A6),D0
LSR.B #4,D0
BEQ.S mt_funkend
LEA mt_FunkTable(PC),A0
MOVE.B (A0,D0.W),D0
ADD.B D0,n_funkoffset(A6)
BTST #7,n_funkoffset(A6)
BEQ.S mt_funkend
CLR.B n_funkoffset(A6)
MOVE.L n_loopstart(A6),D0
MOVEQ #0,D1
MOVE.W n_replen(A6),D1
ADD.L D1,D0
ADD.L D1,D0
MOVE.L n_wavestart(A6),A0
ADDQ.L #1,A0
CMP.L D0,A0
BLO.S mt_funkok
MOVE.L n_loopstart(A6),A0
mt_funkok
MOVE.L A0,n_wavestart(A6)
MOVEQ #-1,D0
SUB.B (A0),D0
MOVE.B D0,(A0)
mt_funkend
MOVEM.L (SP)+,A0/D1
RTS
mt_FunkTable dc.b 0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128
mt_VibratoTable
dc.b 0, 24, 49, 74, 97,120,141,161
dc.b 180,197,212,224,235,244,250,253
dc.b 255,253,250,244,235,224,212,197
dc.b 180,161,141,120, 97, 74, 49, 24
mt_PeriodTable
; Tuning 0, Normal
dc.w 856,808,762,720,678,640,604,570,538,508,480,453
dc.w 428,404,381,360,339,320,302,285,269,254,240,226
dc.w 214,202,190,180,170,160,151,143,135,127,120,113
; Tuning 1
dc.w 850,802,757,715,674,637,601,567,535,505,477,450
dc.w 425,401,379,357,337,318,300,284,268,253,239,225
dc.w 213,201,189,179,169,159,150,142,134,126,119,113
; Tuning 2
dc.w 844,796,752,709,670,632,597,563,532,502,474,447
dc.w 422,398,376,355,335,316,298,282,266,251,237,224
dc.w 211,199,188,177,167,158,149,141,133,125,118,112
; Tuning 3
dc.w 838,791,746,704,665,628,592,559,528,498,470,444
dc.w 419,395,373,352,332,314,296,280,264,249,235,222
dc.w 209,198,187,176,166,157,148,140,132,125,118,111
; Tuning 4
dc.w 832,785,741,699,660,623,588,555,524,495,467,441
dc.w 416,392,370,350,330,312,294,278,262,247,233,220
dc.w 208,196,185,175,165,156,147,139,131,124,117,110
; Tuning 5
dc.w 826,779,736,694,655,619,584,551,520,491,463,437
dc.w 413,390,368,347,328,309,292,276,260,245,232,219
dc.w 206,195,184,174,164,155,146,138,130,123,116,109
; Tuning 6
dc.w 820,774,730,689,651,614,580,547,516,487,460,434
dc.w 410,387,365,345,325,307,290,274,258,244,230,217
dc.w 205,193,183,172,163,154,145,137,129,122,115,109
; Tuning 7
dc.w 814,768,725,684,646,610,575,543,513,484,457,431
dc.w 407,384,363,342,323,305,288,272,256,242,228,216
dc.w 204,192,181,171,161,152,144,136,128,121,114,108
; Tuning -8
dc.w 907,856,808,762,720,678,640,604,570,538,508,480
dc.w 453,428,404,381,360,339,320,302,285,269,254,240
dc.w 226,214,202,190,180,170,160,151,143,135,127,120
; Tuning -7
dc.w 900,850,802,757,715,675,636,601,567,535,505,477
dc.w 450,425,401,379,357,337,318,300,284,268,253,238
dc.w 225,212,200,189,179,169,159,150,142,134,126,119
; Tuning -6
dc.w 894,844,796,752,709,670,632,597,563,532,502,474
dc.w 447,422,398,376,355,335,316,298,282,266,251,237
dc.w 223,211,199,188,177,167,158,149,141,133,125,118
; Tuning -5
dc.w 887,838,791,746,704,665,628,592,559,528,498,470
dc.w 444,419,395,373,352,332,314,296,280,264,249,235
dc.w 222,209,198,187,176,166,157,148,140,132,125,118
; Tuning -4
dc.w 881,832,785,741,699,660,623,588,555,524,494,467
dc.w 441,416,392,370,350,330,312,294,278,262,247,233
dc.w 220,208,196,185,175,165,156,147,139,131,123,117
; Tuning -3
dc.w 875,826,779,736,694,655,619,584,551,520,491,463
dc.w 437,413,390,368,347,328,309,292,276,260,245,232
dc.w 219,206,195,184,174,164,155,146,138,130,123,116
; Tuning -2
dc.w 868,820,774,730,689,651,614,580,547,516,487,460
dc.w 434,410,387,365,345,325,307,290,274,258,244,230
dc.w 217,205,193,183,172,163,154,145,137,129,122,115
; Tuning -1
dc.w 862,814,768,725,684,646,610,575,543,513,484,457
dc.w 431,407,384,363,342,323,305,288,272,256,242,228
dc.w 216,203,192,181,171,161,152,144,136,128,121,114
mt_chan1temp dc.l 0,0,0,0,0,$00010000,0, 0,0,0,0
mt_chan2temp dc.l 0,0,0,0,0,$00020000,0, 0,0,0,0
mt_chan3temp dc.l 0,0,0,0,0,$00040000,0, 0,0,0,0
mt_chan4temp dc.l 0,0,0,0,0,$00080000,0, 0,0,0,0
mt_SampleStarts dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
mt_SongDataPtr dc.l 0
mt_speed dc.b 6
mt_counter dc.b 0
mt_SongPos dc.b 0
mt_PBreakPos dc.b 0
mt_PosJumpFlag dc.b 0
mt_PBreakFlag dc.b 0
mt_LowMask dc.b 0
mt_PattDelTime dc.b 0
mt_PattDelTime2 dc.b 0
mt_Enable dc.b 0
mt_PatternPos dc.w 0
mt_DMACONtemp dc.w 0
ciatime2: dc.l 0
;/* End of File */
********************************************************
***------------------------------------------------------------------------
*** This is the ultimate Data-Decrunch-Routine
*** for Crunch-Mania V1.4
*** (c) 1991 by FRESH THRASH of CERBERUS, all rights reserved
*** You may use this piece of code as long as you don't claim that
*** you have written it. In any case the author (me) has to be
*** mentioned someplace in your proggy.
*** Note: Source- and Destinationaddresses have to be always even Addresses
***------------------------------------------------------------------------
*** Here is the Format of the Header:
*** Type Offset Contents Function
*** LONG 0 "CrM!" to recongnize crunched files
*** WORD 4 Minimum Security Distance to savely decrunch data when
*** Source and Dest is in the same
*** Memoryblock
*** LONG 6 Original Len Datalen before packing
*** LONG 10 ($a) Crunched Len Datalen after packing without
*** Header
**-----------------------------------------------------------
** Jump here to decrunch some data without any overlap checks
** The Regs have to loaded with:
** a0: Adr of Source (with Header)
** a1: Adr of Dest
**-----------------------------------------------------------
NormalDecrunch:
movem.l d0-d7/a0-a6,-(sp)
cmp.l #"CrM!",(a0)+
bne.s .NotCrunched
tst.w (a0)+ ;skip MinSecDist
move.l (a0)+,d1 ;OrgLen
move.l (a0)+,d2 ;CrLen
move.l a0,a2
bsr.s FastDecruncher
.NotCrunched:
movem.l (sp)+,d0-d7/a0-a6
rts
**-------------------------------------------------------------------
** This is the pure Decrunch-Routine
** The Registers have to be loaded with the following values:
** a1: Adr of Destination (normal) ** a2: Adr of Source (packed)
** d1: Len of Destination ** d2: Len of Source
**-------------------------------------------------------------------
FastDecruncher:
move.l a1,a5 ;Decrunched Anfang (hier Ende des Decrunchens)
add.l d1,a1
add.l d2,a2
move.w -(a2),d0 ;Anz Bits in letztem Wort
move.l -(a2),d6 ;1.LW
moveq #16,d7 ;Anz Bits
sub.w d0,d7 ;Anz Bits, die rotiert werden müssen
lsr.l d7,d6 ;1.Bits an Anfang bringen
move.w d0,d7 ;Anz Bits, die noch im Wort sind
moveq #16,d3
moveq #0,d4
.DecrLoop:
move.w d1,bgc
cmp.l a5,a1
ble.L .DecrEnd ;a1=a5: fertig (a1<a5: eigentlich Fehler)
bsr.s .BitTest
bcc.s .InsertSeq ;1.Bit 0: Sequenz
moveq #0,d4
** einzelne Bytes einfügen **
.InsertBytes:
moveq #8,d1
bsr.w .GetBits
move.b d0,-(a1)
dbf d4,.InsertBytes
bra.s .DecrLoop
*------------
.SpecialInsert:
moveq #14,d4
moveq #5,d1
bsr.s .BitTest
bcs.s .IB1
moveq #14,d1
.IB1: bsr.s .GetBits
add.w d0,d4
bra.s .InsertBytes
*------------
.InsertSeq:
** Anzahl der gleichen Bits holen **
bsr.s .BitTest
bcs.s .AB1
moveq #1,d1 ;Maske: 0 (1 AB)
moveq #1,d4 ;normal: Summe 1
bra.s .ABGet
.AB1:
bsr.s .BitTest
bcs.s .AB2
moveq #2,d1 ;Maske: 01 (2 ABs)
moveq #3,d4 ;ab hier: Summe mindestens 3
bra.s .ABGet
.AB2:
bsr.s .BitTest
bcs.s .AB3
moveq #4,d1 ;Maske: 011 (4 ABs)
moveq #7,d4 ;hier: Summe 11
bra.s .ABGet
.AB3:
moveq #8,d1 ;Maske: 111 (8 ABs)
moveq #$17,d4 ;hier: Summe 11
.ABGet:
bsr.s .GetBits
add.w d0,d4 ;d0: Länge der Sequenz - 1
cmp.w #22,d4
beq.s .SpecialInsert
blt.s .Cont
subq.w #1,d4
.Cont:
** SequenzAnbstand holen **
bsr.s .BitTest
bcs.s .DB1
moveq #9,d1 ;Maske: 0 (9 DBs)
moveq #$20,d2
bra.s .DBGet
.DB1:
bsr.s .BitTest
bcs.s .DB2
moveq #5,d1 ;Maske: 01 (5 DBs)
moveq #0,d2
bra.s .DBGet
.DB2:
moveq #14,d1 ;Maske: 11 (12 DBs)
move.w #$220,d2
.DBGet:
bsr.s .GetBits
add.w d2,d0
lea 0(a1,d0.w),a3 ;a3 auf Anf zu kopierender Seq setzten
.InsSeqLoop:
move.b -(a3),-(a1) ;Byte kopieren
dbf d4,.InsSeqLoop
bra.w .DecrLoop
*------------
.BitTest:
subq.w #1,d7
bne.s .BTNoLoop
moveq #16,d7 ;hier kein add notwendig: d7 vorher 0
move.w d6,d0
lsr.l #1,d6 ;Bit rausschieben und Flags setzen
swap d6 ;ror.l #16,d6
move.w -(a2),d6 ;nächstes Wort holen
swap d6 ;rol.l #16,d6
lsr.w #1,d0 ;Bit rausschieben und Flags setzen
rts
.BTNoLoop:
lsr.l #1,d6 ;Bit rausschieben und Flags setzen
rts
*----------
.GetBits: ;d1:AnzBits->d0:Bits
move.w d6,d0 ;d6:Akt Wort
lsr.l d1,d6 ;nächste Bits nach vorne bringen
sub.w d1,d7 ;d7:Anz Bits, die noch im Wort sind
bgt.s .GBNoLoop
; add.w #16,d7 ;BitCounter korrigieren
add.w d3,d7 ;BitCounter korrigieren
ror.l d7,d6 ;restliche Bits re rausschieben
move.w -(a2),d6 ;nächstes Wort holen
rol.l d7,d6 ;und zurückrotieren
.GBNoLoop:
add.w d1,d1 ;*2 (in Tab sind Ws)
and.w .AndData-2(pc,d1.w),d0 ;unerwünschte Bits rausschmeißen
rts
*----------
.AndData:
dc.w %1,%11,%111,%1111,%11111,%111111,%1111111
dc.w %11111111,%111111111,%1111111111
dc.w %11111111111,%111111111111
dc.w %1111111111111,%11111111111111
*-----------
.DecrEnd:
rts ;a5: Start of decrunched Data
********************************************************
search_for_disk:
move.l d0,looklabel
sfd_loop:
move.b #0,drive
move.l #1,d7 ; check drive for ready
trap #load
cmp.l looklabel,d0
beq found_disk
move.b #1,drive
move.l #1,d7 ; check drive for ready
trap #load
cmp.l looklabel,d0
beq found_disk
move.b #2,drive
move.l #1,d7 ; check drive for ready
trap #load
cmp.l looklabel,d0
beq found_disk
move.b #3,drive
move.l #1,d7 ; check drive for ready
trap #load
cmp.l looklabel,d0
beq found_disk
;bsr show_insert_pic
bra sfd_loop
found_disk:
clr.l d0
rts
get_volume_name:
move.l #0,label
lea $bfd000,a5
move.b #$ff,$100(a5) ; deselect all drives
bsr mini_pause
bclr #7,$100(a5) ; motor on
bsr mini_pause
move.b drive,d6
add.b #3,d6
bclr d6,$100(a5) ; select drive
bsr mini_pause
move.w #600/headspeed,d7
.volloop
bsr mspause
btst #5,$1001(a5) ; drive ready
beq .is_ready
dbf d7,.volloop
.not_ready
move.b #$ff,$100(a5) ; deselect all drives
bsr mini_pause
move.b #$ff,d0
move.b drive,d6
add.b #3,d6
bchg d6,d0
move.b d0,$100(a5) ; select drive
bsr mini_pause
move.b #$ff,$100(a5) ; deselect all drives
bsr mini_pause
move.l #-1,d0
rte
.is_ready
move.l volumespace,a0 ; load address
move.l #$000000,d0 ; disk address (as trackdisk.device)
move.l #$400,d1 ; length
move.l #0,d7 ; mfm load
trap #load
move.l 14(a0),label
move.l 14(a0),d0
rte
loadtracks:
cmp.l #1,d7
beq get_volume_name
movem.l d0-d7/a1-a6,-(sp)
move.l a0,loadaddress
move.l d0,diskaddress
move.l d1,loadlength
lsr.l #7,d1
lsr.l #2,d1 ; div by 512
divu #11,d1 ; number of tracks
and.l #$ffff,d1
add.w #1,d1
cmp.l #$2c00,loadlength
blt .short_load
add.w #1,d1
.short_load
lsr.l #7,d0
lsr.l #2,d0 ; div by 512
divu #11,d0
and.l #$ffff,d0
move.w d0,temp
; d0=track
; d1=number of tracks
lea workspace,a4 ; workspace
lea $bfd000,a5 ; base address of cia
lea $dff000,a6 ; base address of hardware
move.l #$55555555,d7 ; data mask - for mfm decoding
move.b $1f01(a5),d6
and.b #%11000000,d6
or.b #%00001000,d6
move.b d6,$1f01(a5)
move.b #%00000010,$1d01(a5)
move.b #(time&$ff),$1601(a5)
move.b #(time>>8),$1701(a5)
move.w #$98d0,d5 ; disk length
move.w #$4489,a1 ; disk sync
bsr load2
clr.l d2
move.w temp,d2 ; track number
move.l loadaddress,a0
move.l diskaddress,d0
move.l loadlength,d1
mulu #11,d2
asl.l #7,d2
asl.l #2,d2
sub.l d2,d0
add.l d0,a0 ; a0 = data start address
movem.l (sp)+,d0-d7/a1-a6
rte
load2: subq.w #1,d1
bmi mini_pause
bsr find_track
read_tracks
bsr.w readdata
move.l a4,a2
moveq #10,d6
find_sync
cmp.w (a2)+,a1
bne.b find_sync
cmp.w (a2),a1
bne.b double_sync
add.l #2,a2
double_sync
move.l (a2),d3
move.l 4(a2),d4
and.w d7,d3
and.w d7,d4
lsl.w #1,d3
or.w d4,d3
asr.w #8,d3
move.l a0,a3
lsl.w #8,d3
lsl.w #1,d3
add.w d3,a3
lea $38(a2),a2
moveq #127,d2
decode_mfm
move.l $200(a2),d3
move.l (a2)+,d4
and.l d7,d3
and.l d7,d4
lsl.l #1,d4
or.l d3,d4
move.l d4,(a3)+
dbf d2,decode_mfm
dbf d6,find_sync
lea $1600(a0),a0
add.b #1,d0
bsr mspause
bsr.b flip_side
bsr mspause
dbf d1,read_tracks
finished_blocks:
move.b #$ff,$100(a5) ; deselect all drives
bsr.b mini_pause
move.b #$ff,d0
move.b drive,d6
add.b #3,d6
bchg d6,d0
move.b d0,$100(a5) ; select drive
bsr mini_pause
move.b #$ff,$100(a5) ; deselect all drives
mini_pause:
rts
find_track
move.b #$ff,$100(a5) ; deselect all drives
bsr.b mini_pause
bclr #7,$100(a5) ; motor on
bsr.b mini_pause
move.b drive,d6
add.b #3,d6
bclr d6,$100(a5) ; select drive 0
bsr.b mini_pause
bsr.b drive_ready
bset #1,$100(a5) ; direction towards outside
; look for track 0
track_0:
btst #4,$1001(a5) ; check for track 0
beq.b side0
bsr.b step_heads
bra.b track_0
flip_side:
bchg #2,$100(a5) ; change side
btst #0,d0
bne.b mini_pause
centre: bclr #1,$100(a5) ; direction towards centre
step_heads:
bclr #0,$100(a5) ; pulse step low
bsr.b mini_pause
bset #0,$100(a5) ; pulse step high
bsr mspause ; milisecond pause
rts
side0: bset #2,$100(a5) ; side 0
move.w d0,d2
lsr.b #1,d2
bcc.b side1
bclr #2,$100(a5) ; side 1
side1: subq.b #1,d2
bmi mini_pause
find_centre:
bsr.b centre
dbf d2,find_centre
rts
drive_ready:
btst #5,$1001(a5) ; drive ready
bne.b drive_ready
rts
readdata:
move.w #$8500,$9e(a6) ; set bits 8,10 = disk data clock rate 1=fast
; word sync to sync ($4489)
move.w a1,$7e(a6) ; set sync to $4489
bsr drive_ready
move.w #$4000,$24(a6) ; disk length (write disk to ram)
move.l a4,$20(a6) ; disk pointer
move.w d5,$24(a6) ; disk length($18d0 + set)
move.w d5,$24(a6) ; disk length again - must be twice(!!)
move.w #2,$9c(a6) ; int req - clear disk blk finished
waitblk: move.w $1e(a6),d2 ; irq bits read -
btst #1,d2 ; disk blk finished
beq waitblk
rts
mspause:
lea $bfd000,a5 ; base address of cia
move.b $1f01(a5),d6
and.b #%11000000,d6
or.b #%00001000,d6
move.b d6,$1f01(a5)
move.b #%00000010,$1d01(a5)
move.b #(time&$ff),$1601(a5)
move.b #(time>>8),$1701(a5)
busy_wait:
btst.b #1,$1d01(a5)
beq busy_wait
rts
********************************************************
loadmodule:
move.l diskptr,a6
move.l 00(a6),d0
bsr search_for_disk
.reloadfile
move.l my_mem,a0 ; load address
move.l 04(a6),d0 ; disk address
move.l 08(a6),d1 ; length
move.l #0,d7 ; mfm load
trap #load
movem.l d1-d7/a0-a6,-(a7)
move.l 08(a6),d1
lsr.l #2,d1
sub.l #1,d1
move.l #0,d0
.loop move.l (a0)+,d2
eor.l d2,d0
sub.l #1,d1
bpl.s .loop
movem.l (a7)+,d1-d7/a0-a6
cmp.l 16(a6),d0 ; checksum
bne .reloadfile
move.l mt_data1,a1
bsr NormalDecrunch
rts
********************************************************
show_iff:
;move.w #$0200,iff_res+2
move.l iff,a0
cmp.l #"FORM",(a0)
bne not_iff
move.l iff,a0
move.l #"BMHD",d0
bsr findhunk
cmp.l #-1,a0
beq not_iff
move.w 08(a0),iff_width
move.w 10(a0),iff_height
move.b 16(a0),iff_depth
move.b 18(a0),iff_compression
move.w iff_width,d0
lsr.w #3,d0
move.w iff_height,d1
mulu d0,d1
move.l d1,iff_bmpsize
move.b iff_depth,d0
mulu d0,d1
move.l iff_maxsize,d0
cmp.l d1,d0
blt not_iff
move.l iff,a0
move.l #"CMAP",d0
bsr findhunk
cmp.l #-1,a0
beq not_iff
bsr decode_iff_cmap
move.l iff,a0
move.l #"BODY",d0
lea mainscreen,a3
bsr findhunk
cmp.l #-1,a0
beq not_iff
bsr iff_body
lea iff_cmap,a0
;lea cmap+2,a1
;move.w iff_colours,d0
;sub.w #1,d0
.cmaploop
;move.w (a0)+,(a1)
;add.l #4,a1
;dbf d0,.cmaploop
move.l #mainscreen,d0
move.l iff_bmpsize,d1
move.w d0,bitplane0_lo
swap d0
move.w d0,bitplane0_hi
swap d0
add.l d1,d0
move.w d0,bitplane1_lo
swap d0
move.w d0,bitplane1_hi
swap d0
add.l d1,d0
move.w d0,bitplane2_lo
swap d0
move.w d0,bitplane2_hi
swap d0
add.l d1,d0
move.w d0,bitplane3_lo
swap d0
move.w d0,bitplane3_hi
swap d0
add.l d1,d0
move.w d0,bitplane4_lo
swap d0
move.w d0,bitplane4_hi
moveq #0,d0
move.b iff_depth,d0
asl.w #8,d0
asl.w #4,d0
or.w #$0200,d0
;move.w d0,iff_res+2
rts
not_iff:
move.w #$fff,bgc
rts
*************************************************************
decode_iff_cmap:
move.l 4(a0),d0
divu #3,d0
move.w d0,iff_colours
sub.w #1,d0
add.l #8,a0
lea iff_cmap,a1
cmap_loop:
moveq #0,d2
moveq #0,d1
move.b 0(a0),d1
asl.w #4,d1
or.w d1,d2
moveq #0,d1
move.b 1(a0),d1
or.w d1,d2
moveq #0,d1
move.b 2(a0),d1
lsr.w #4,d1
or.w d1,d2
move.w d2,(a1)+ ; store cmap
add.l #3,a0 ; next colour
dbf d0,cmap_loop
rts
*************************************************************
iff_body:
moveq #0,d7
moveq #0,d6
moveq #0,d5
move.w iff_width,d5
lsr.w #3,d5
move.l a3,a2
lea 8(a0),a1
add.l 4(a0),a1
add.l #8,a0
cmp.b #1,iff_compression
beq do_byterun1
.err move.w $dff006,$dff180
bra .err
do_byterun1:
moveq #0,d0
move.b (a0)+,d0
cmp.b #128,d0
beq iff_body_end ; 128=nop
bclr #7,d0
beq iff_not_byterun
moveq #0,d1
move.b (a0)+,d1
move.w #128,d2
sub.w d0,d2
move.w d2,d0
add.w d0,d7
add.w #1,d7
iff_byterun1
move.b d1,(a2)+
dbf d0,iff_byterun1
bra iff_body_end
iff_not_byterun
add.w d0,d7
add.w #1,d7
iff_not_byterun2
move.b (a0)+,(a2)+
dbf d0,iff_not_byterun2
iff_body_end
cmp.w d5,d7
bne .no_end
move.w #0,d7
move.l a3,a2
move.l iff_bmpsize,d0
add.w #1,d6
move.l d6,d1
mulu d1,d0
add.l d0,a2
moveq #0,d0
move.b iff_depth,d0
cmp.w d6,d0
bne .no_end
moveq #0,d6
moveq #0,d0
move.w iff_width,d0
lsr.w #3,d0
add.l d0,a3
move.l a3,a2
.no_end
cmp.l a1,a0
blt do_byterun1
.br1fin
rts
*************************************************************
findhunk:
lea 8(a0),a1
add.l 4(a0),a1
.findloop
cmp.l a1,a0
bge .cantfind
add.l #2,a0
move.l (a0),d1
cmp.l d0,d1
bne .findloop
rts
.cantfind
move.l #-1,a0
rts
********************************************************
calc_cmap:
move.w #0,d7
lea iff_cmap,a0
lea cmaplist,a1
cmaploop1:
move.w #15,d6
cmaploop2:
move.w d6,d4
asl.w #1,d4
move.w d6,d5
cmp.w #0,fadedir
beq nos1c
not.w d5
nos1c:
move.w (a0),d0
and.w #$00f,d0
sub.w d5,d0
cmp.w #0,d0
bgt nos1a
move.w #0,d0
nos1a: cmp.w #$00f,d0
blt nos1b
move.w #$00f,d0
nos1b:
move.w d6,d5
cmp.w #0,fadedir
beq nos2c
not.w d5
nos2c: asl.w #4,d5
move.w (a0),d1
and.w #$0f0,d1
sub.w d5,d1
cmp.w #0,d1
bgt nos2a
move.w #0,d1
nos2a: cmp.w #$0f0,d1
blt nos2b
move.w #$0f0,d1
nos2b:
move.w d6,d5
cmp.w #0,fadedir
beq nos3c
not.w d5
nos3c: asl.w #8,d5
move.w (a0),d2
and.w #$f00,d2
sub.w d5,d2
cmp.w #0,d2
bgt nos3a
move.w #0,d2
nos3a: cmp.w #$f00,d2
blt nos3b
move.w #$f00,d2
nos3b:
add.w d1,d0
add.w d2,d0
move.w d0,(a1,d4.w)
dbf d6,cmaploop2
add.l #2,a0
add.l #32,a1
add.w #1,d7
cmp.w #32,d7
blt cmaploop1
rts
fadeout:
move.w d0,fadedir
bsr calc_cmap
lea cmaplist,a1
move.w #15,d1
tmaploop2:
lea cmap+2,a0
move.w #31,d0
move.l a1,a2
bsr bpos
bsr bpos
tmaploop1:
move.w (a2),(a0)
add.l #4,a0
add.l #16*2,a2
dbf d0,tmaploop1
add.l #2,a1
dbf d1,tmaploop2
rts
fadein:
move.w d0,fadedir
bsr calc_cmap
lea cmaplist+(15*2),a1
move.w #15,d1
omaploop2:
lea cmap+2,a0
move.w #31,d0
move.l a1,a2
bsr bpos
bsr bpos
omaploop1:
move.w (a2),(a0)
add.l #4,a0
add.l #16*2,a2
dbf d0,omaploop1
sub.l #2,a1
dbf d1,omaploop2
rts
bpos: cmp.b #$ff,$dff006
bne bpos
.loop cmp.b #$ff,$dff006
beq .loop
rts
cmaplist: dcb.w 16*32,0
fadedir: dc.l 0
********************************************************
my_copper:
iff_res: dc.w $100,$5200 ; 4 bp - lo res
dc.w $104,$a ; bp control reg
dc.w $108,0 ; bp modulo - odd
dc.w $10a,0 ; bp modulo - even
dc.w $180,0 ; colour 0 to black
dc.w $102,0
dc.w $08e,$2c81 ; bp window start left
dc.w $090,$30c1 ; bp window bot right
dc.w $94,$d0 ; bp stop horz
dc.w $92,$38
dc.w $120,0,$122,0
dc.w $124,0,$126,0
dc.w $128,0,$12a,0
dc.w $12c,0,$12e,0
dc.w $130,0,$132,0
dc.w $134,0,$136,0
dc.w $138,0,$13a,0
dc.w $13c,0,$13e,0
dc.w $e0
bitplane0_hi: dc.w 0,$e2
bitplane0_lo: dc.w 0,$e4
bitplane1_hi: dc.w 0,$e6
bitplane1_lo: dc.w 0,$e8
bitplane2_hi: dc.w 0,$ea
bitplane2_lo: dc.w 0,$ec
bitplane3_hi: dc.w 0,$ee
bitplane3_lo: dc.w 0,$f0
bitplane4_hi: dc.w 0,$f2
bitplane4_lo: dc.w 0
cmap: dc.w $180,$000
dc.w $182,$000
dc.w $184,$000
dc.w $186,$000
dc.w $188,$000
dc.w $18a,$000
dc.w $18c,$000
dc.w $18e,$000
dc.w $190,$000
dc.w $192,$000
dc.w $194,$000
dc.w $196,$000
dc.w $198,$000
dc.w $19a,$000
dc.w $19c,$000
dc.w $19e,$000
dc.w $1a0,$000
dc.w $1a2,$000
dc.w $1a4,$000
dc.w $1a6,$000
dc.w $1a8,$000
dc.w $1aa,$000
dc.w $1ac,$000
dc.w $1ae,$000
dc.w $1b0,$000
dc.w $1b2,$000
dc.w $1b4,$000
dc.w $1b6,$000
dc.w $1b8,$000
dc.w $1ba,$000
dc.w $1bc,$000
dc.w $1be,$000
dc.w $ffe1,$fffe ; end of ntsc screen
pic_down: dc.w $1c07,$fffe
dc.w $100,0
dc.w $e0
splane0_hi: dc.w 0,$e2
splane0_lo: dc.w 0,$e4
splane1_hi: dc.w 0,$e6
splane1_lo: dc.w 0,$e8
splane2_hi: dc.w 0,$ea
splane2_lo: dc.w 0
dc.w $0180,$0000,$0182,$0fff,$0184,$0fec,$0186,$0ec9
dc.w $0188,$0ca6,$018a,$0b94,$018c,$0a72,$018e,$0960
dc.w $108,swide*3 ; bp modulo - odd
dc.w $10a,swide*3 ; bp modulo - even
scroll_off: dc.w $102,0
dc.w $94,$d8 ; bp stop horz
dc.w $92,$30 ; bt start horz
dc.w $1e07,$fffe
dc.w $100,$3200
dc.w $3001,$ff00 ; end of pal screen
dc.w $9c,$8010 ; irq set bits - restart copper
dc.w $ffff,$fffe ; end of copper list
scrollmem: dcb.l 14*16*4
sfont: incbin "dh0:data/techno/ScrollFont.bin"
section mods,bss_c
mod_data1: ds.l 36250
mod_data2: ds.l 36250
workspace: ds.l $c80 ; dma for loader
mainscreen: dcb.l 10*256*5
screen1: dcb.l 10*256*1
screen2: dcb.l 10*256*1
screen3: dcb.l 10*256*1
section temp,data
my_mem: dc.l 0
mt_data1: dc.l mod_data1
mt_data2: dc.l mod_data2
songended: dc.l 0
volumespace: dc.l 0
drive: dc.w 0
temp: dc.l 0
label: dc.l 0
looklabel: dc.l 0
loadaddress: dc.l 0
diskaddress: dc.l 0
loadlength: dc.l 0
equon: dc.w 0
scroll_trigger: dc.w 0
iff_width: dc.w 0 ; width in pixels
iff_height: dc.w 0 ; height in pixels
iff_bmpsize: dc.l 0 ; bitmap size
iff_depth: dc.b 0 ; no. of bitplanes
iff_compression: dc.b 0 ; compresstion type (0=bitmap, 1=byterun1)
iff_colours: dc.w 0 ; no., of colours
iff_maxsize: dc.l 40*256*5 ; max size allowed for iff pic
iff_cmap: dcb.w 32,0 ; buffers for colourmap
iff: dc.l 0 ; ptr to iff pic
scroll_ptr: dc.l scrolltext
screen1a: dc.l screen1
screen1b: dc.l screen2
screen1c: dc.l screen3
showsound1: dc.l null_sample
showsound2: dc.l null_sample
showsound3: dc.l null_sample
showsound4: dc.l null_sample
showlen1: dc.l 0
showlen2: dc.l 0
showlen3: dc.l 0
showlen4: dc.l 0
ss: dc.l 0
sl: dc.l 0
table:
a set 32
rept 32
dc.w a*40
dc.w a*40
a set a+1
endr
a set 0
rept 32
dc.w a*40
dc.w a*40
a set a+1
endr
oldint: dc.l 0
olddma: dc.l 0
oldv3: dc.l 0
diskptr: dc.l diskmap
diskmap: dc.l "TWAR",$00400,099754,0,$64E50037
dc.l "TWAR",$18A00,112604,0,$F3997123
dc.l "TWAR",$34200,078212,0,$CB21BD3
dc.l "TWAR",$47400,090644,0,$E7B6FA2A
dc.l "TWAR",$5D800,090226,0,$515E2C85
dc.l "TWAR",$73A00,111710,0,$E0C89426
dc.l "TWAR",$8F000,098280,0,$D7A7C441
dc.l "TWAR",$A7000,107450,0,$4758AF44
dc.l -1
null_sample: dcb.b 400,0
main_pic: incbin "dh0:data/techno/main.iff"
intro_pic: incbin "dh0:data/techno/slanepic.iff"
gfxlib: dc.b "graphics.library",0
scrolltext: incbin "dh0:data/techno/scroll.txt"
dc.b 0
even